<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://cdn.staticfile.org/vue/3.0.5/vue.global.js"></script>
    <title>Document</title>
    <style>
        .red {
            color: red;
        }
       
        .fontsize{
            font-size:20px;
        }

        .fontstyle{
            font-style : italic;
        }
    </style>
</head>

<body>

    <div id="app">

    </div>
    <template id="main">
        <div style="color: red;">
            {{main}}
            <firstvue></firstvue>

        </div>
    </template>
    <template id="first">
        <div style="color: blue;">
            {{first}}
            <twovue :twoname="firstvalue" 
                    :twoname1="firstvalue1" 
                    :twoname2="firstvaluecolor"
                    :twoname3="firstvalue3"></twovue>
        </div>
    </template>
    <template id="two">
        <div :class="towname2">
            取字符串：---- {{two}} <br/>
            取字符串：---- {{twoname}} <br/>
            取字符串：---- {{twoname1}} <br/>
            取对象：  ---- {{twoname2}} <br/>
            取对象中的值：---- {{twoname2.red}} <br/>
            取用数组：（如果没有传递，返回默认值）   ----- {{twoname3}}<br>
            取用数组中的值：（如果没有传递，返回默认值）   ----- {{twoname3[0]}}<br>
        </div>
    </template>
</body>

<script>

    let twoconfig = {
        template: '#two',
        props: {
            twoname: {
                //指定属性类型
                type: String,
                //required指定该属性是否必传，为true时父组件使用该组件时必须传递该参数，否则控制台警告
                required: true,
                //设置默认值，当父组件没有传入此属性值时则使用该默认值
                default: '默认值'
            },
            twoname1: {
                type: String,
                required: true,
                default: 'test2 is null'
            },
            twoname2:
            {
                type: Object,
                required: true,
                //当指定类型为 对象或数组 时，默认值需使用方法返回对象，以确保每个实例的默认值来自不同引用
                default() {
                    return {
                        name: 'test3 is null'
                    }
                }
            },
            twoname3:{
                type:Array,
                required:true,
                default(){
                    return {
                        f1: 'twoname3 is null'
                    }
                }
            }
        },
        data() {
            return {
                two: 'two info'
            }
        }
    };

    let firstconfig = {
        template: '#first',
        data() {
            return {
                first: 'first info',
                firstvalue: '我是first的信息',
                firstvalue1: '我是first的信息1',
                firstvaluecolor: {
                    red:'red', //红色
                    fontsize:'fontsize', //加粗显示
                    fontstyle:'fontstyle' //斜体
                },
                firstvalue3:['f1','f2','f3']
            }
        },
        components: {
            twovue: twoconfig
        }
    };

    let mainconfig = {
        template: '#main',
        data() {
            return {
                main: 'main info'
            }
        },
        components: {
            firstvue: firstconfig
        }
    };

    Vue.createApp(mainconfig).mount("#app");
    // Vue.createApp(firstconfig).mount("#app");
    // Vue.createApp(twoconfig).mount("#app");

</script>

</html>